package com.ams.common.web.exception;

import com.ams.common.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author： 乐哥聊编程(全平台同号)
 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {


    /**
     * 全局异常处理：
     * 使用 @ExceptionHandler 注解，你可以定义全局的异常处理方法。当在控制器中抛出异常时，Spring 会查找与此异常匹配的 @ExceptionHandler 方法，并调用它。
     * 由于 @RestControllerAdvice 与 @ResponseBody 结合，所以返回的响应体会自动转换为 JSON 或其他配置的媒体类型。
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(IllegalArgumentException.class)
    public <T> R<T> handleIllegalArgumentException(IllegalArgumentException e) {
        log.error("非法参数异常，异常原因：{}", e.getMessage(), e);
        e.printStackTrace();
        return R.failed(e.getMessage());
    }

    /**
     * 数据绑定增强：
     * 使用 @InitBinder 注解，你可以自定义数据绑定逻辑。例如，你可以定义自定义的日期格式、字符串修剪等。
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        dateFormat.setLenient(false);
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    }


}
